1 Tekrarlanabilir Analiz ve Rapor


1.2 Replication Crisis Excel Version


2 RStudio ile proje oluştur


3 R Notebook

3.1 R Notebook dökümanı oluşturma


3.2 R Notebook’tan html, pdf ve word oluşturma


3.3 RNotebook vs RMarkdown

https://youtu.be/zNzZ1PfUDNk


4 R Markdown

4.1 Hem kendi kodları hem de html kodları yazılabilir

https://rmarkdown.rstudio.com

What is R Markdown? from RStudio, Inc. on Vimeo.


4.2 R Markdown: The Definitive Guide

https://bookdown.org/yihui/rmarkdown/


4.3 R Markdown syntax

https://gist.github.com/MinhasKamal/7fdebb7c424d23149140


4.4 Remedy Package


4.4.1 Remedy


4.6 Render Markdown via code

inside R

markdown::markdownToHTML('markdown_example.md', 
'markdown_example.html')

command line

R -e "markdown::markdownToHTML('markdown_example.md',
'markdown_example.html')"

4.7 pandoc Rstudio integration

command line

export PATH=$PATH:/Applications/RStudio.app/Contents/MacOS/pandoc
R -e "rmarkdown::render('markdown_example.md')"

5 RMarkdown chunk içinde R kodlarını çalıştırma

{r, results='asis'}
 iris %>%
  tibble::as_tibble() %>%
  details::details(summary = 'tibble')

6 Metin arasında R kodlarını çalıştırma


7 Chunk Options

7.1 Global Options

{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.width = 12, fig.height = 8, fig.path = 'Figs/', echo = FALSE, warning = FALSE, message = FALSE, error = FALSE, eval = TRUE, tidy = TRUE, comment = NA)

7.2 Other Code Languages


8 R Markdown kod örneği

{r}
data("cancer")
cancer
foreign::write.foreign(df = cancer,
                        datafile = "data/cancer.sav",
                        codefile = "data/cancer.spo",
                        package = "SPSS"
                        )

9 R Markdown Paket Çağırma

{r}
suppressPackageStartupMessages(library("tidyverse"))
suppressPackageStartupMessages(library("survival"))
suppressPackageStartupMessages(library("finalfit"))

10 R Markdown Veri Yükleme SPSS


11 R Markdown Veri Yükleme Excel


12 R Markdown Tanımlayıcı İstatistikler

{r}
library(summarytools)
view(dfSummary(colon_s))

summarytools descriptives


13 R Markdown Recode

recode


14 R Markdown örneği Çapraz Tablolar

crosstables


15 R Markdown örneği Sağkalım

survival


16 Güncellemeler olunca kodlar çalışacak mı?


16.1 Paket Kütüphaneleri

  • packrat / renv

https://environments.rstudio.com


16.2 Docker

  • docker

16.3 Yeni R sürümleri

  • RSwitch

https://rud.is/rswitch/

  • Using RSwitch

https://rud.is/rswitch/guide/

: scale 30%


17 Yedeklemeyi nasıl yapacağız

17.1 Save Final Data

{r}
saved data after analysis to `mydata.xlsx`.

save.image(file = here::here("data", "mydata_work_space.RData"))

readr::write_rds(x = mydata, path = here::here("data", "mydata_afteranalysis.rds"))

saveRDS(object = mydata, file = here::here("data", "mydata.rds"))

writexl::write_xlsx(mydata, here::here("data", "mydata.xlsx"))

paste0(rownames(file.info(here::here("data", "mydata.xlsx"))), " : ", file.info(here::here("data", "mydata.xlsx"))$ctime)

17.2 GitHub

{r github push}
CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", 
                    wd,
                    " \n git add . \n git commit --message '",
                    CommitMessage,
                    "' \n git push origin master \n",
                    sep = ""
                    )
system(command = gitCommand,
       intern = TRUE
)

17.3 GitHub Yedekleme

CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", 
                    wd,
                    " \n git add . \n git commit --message '",
                    CommitMessage,
                    "' \n git push origin master \n",
                    sep = ""
                    )

system(command = gitCommand,
       intern = TRUE
)

18 Her dökümanın sonuna kullandığınız kütüphaneler için atıf yazdırabilirsiniz

{r library citation, echo=TRUE}
citation()

18.1 Libraries Used

citation()

18.2 Bu oturuma spesifik kullanılan paketler

report::cite_packages(session = sessionInfo())

18.3 Tek tek paket atıfları

{r library citations}
citation("tidyverse")
{r}
citation("readxl")
citation("janitor")
citation("report")
citation("finalfit")
citation("ggstatplot")

18.4 Jamovi ve R için atıf örneği

The jamovi project (2019). jamovi. (Version 0.9) [Computer Software]. Retrieved from https://www.jamovi.org. R Core Team (2018). R: A Language and envionment for statistical computing. [Computer software]. Retrieved from https://cran.r-project.org/. Fox, J., & Weisberg, S. (2018). car: Companion to Applied Regression. [R package]. Retrieved from https://cran.r-project.org/package=car.


19 Her dökümanın sonuna oturum detaylarınızı yazdırabilirsiniz

{r session info, echo=TRUE}
sessionInfo()

19.1 Session Info

sessionInfo()

20 Sonraki Konular

  • RStudio ile GitHub kullanımı

22 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara linklerle referans vermeye çalıştım.↩︎

LS0tCnRpdGxlOiBSLCBSU3R1ZGlvIHZlIFJNYXJrZG93biBpbGUgVGVrcmFybGFuYWJpbGlyIFJhcG9yXltCdSBiaXIgZGVybGVtZWRpciwgbcO8bWvDvG4gbWVydGViZSBhbMSxbnTEsWxhcmEgbGlua2xlcmxlIHJlZmVyYW5zIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmluc3RpdHV0ZTogIltzZXJkYXJiYWxjaS5jb21dKGh0dHBzOi8vd3d3LnNlcmRhcmJhbGNpLmNvbSkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgcmV2ZWFsanM6OnJldmVhbGpzX3ByZXNlbnRhdGlvbjoKICAgIGluY3JlbWVudGFsOiB0cnVlCiAgICB0aGVtZTogc2t5CiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICBjZW50ZXI6IGZhbHNlCiAgICBzbWFydDogdHJ1ZQogICAgdHJhbnNpdGlvbjogZmFkZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIGlnX3dpZHRoOiA3CiAgICBmaWdfaGVpZ2h0OiA2CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgcmV2ZWFsX29wdGlvbnM6CiAgICAgIHNsaWRlTnVtYmVyOiB0cnVlCiAgICAgIHByZXZpZXdMaW5rczogdHJ1ZQogIHJtZHNob3dlcjo6c2hvd2VyX3ByZXNlbnRhdGlvbjoKICBodG1sX25vdGVib29rOgogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKICB4YXJpbmdhbjo6bW9vbl9yZWFkZXI6CiAgICBsaWJfZGlyOiBsaWJzCiAgICBuYXR1cmU6CiAgICAgIGJlZm9yZUluaXQ6IFsibWFjcm9zLmpzIiwgImh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyJdCiAgICAgIGhpZ2hsaWdodFN0eWxlOiBnaXRodWIKICAgICAgaGlnaGxpZ2h0TGluZXM6IHRydWUKICAgICAgY291bnRJbmNyZW1lbnRhbFNsaWRlczogZmFsc2UKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgcHJldHR5ZG9jOjpodG1sX3ByZXR0eToKICAgIHRoZW1lOiBsZW9uaWRzCiAgICBoaWdobGlnaHQ6IGdpdGh1YgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc1JwogIGh0bWxfZG9jdW1lbnQ6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWdzLycsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIGV2YWwgPSBUUlVFLCB0aWR5ID0gVFJVRSwgY29tbWVudCA9IE5BLCBjYWNoZSA9IFRSVUUpCmBgYAoKCgpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIHhhcmluZ2FuOjppbmZfbXIoKQojIHNlcnZyOjpkYWVtb25fc3RvcCgxKQpgYGAKCgoKIyBUZWtyYXJsYW5hYmlsaXIgQW5hbGl6IHZlIFJhcG9yCgoKLS0tCgoKIyMgUmVwbGljYXRpb24gQ3Jpc2lzCgohW10oZmlndXJlcy9yZXBsaWNhdGlvbkNyaXNpcy5wbmcpCgpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZXBsaWNhdGlvbl9jcmlzaXMKCgotLS0KCiMjIFJlcGxpY2F0aW9uIENyaXNpcyBFeGNlbCBWZXJzaW9uCgpbIVtdKGZpZ3VyZXMvZ2VuZU5hbWVzRXhjZWwucG5nKV0oaHR0cHM6Ly9nZW5vbWViaW9sb2d5LmJpb21lZGNlbnRyYWwuY29tL2FydGljbGVzLzEwLjExODYvczEzMDU5LTAxNi0xMDQ0LTcpCgoKLS0tCgojIFJTdHVkaW8gaWxlIHByb2plIG9sdcWfdHVyCgoKCiFbXShpbWFnZXMvUlN0dWRpby1OZXdQcm9qZWN0LmdpZikKCgoKLS0tCgojIFIgTm90ZWJvb2sgIAoKIyMgUiBOb3RlYm9vayBkw7Zrw7xtYW7EsSBvbHXFn3R1cm1hIAoKCiFbXShpbWFnZXMvUk5vdGVib29rMS5naWYpCgotLS0KCiMjIFIgTm90ZWJvb2sndGFuIGh0bWwsIHBkZiB2ZSB3b3JkIG9sdcWfdHVybWEgIAoKCiFbXShpbWFnZXMvUk5vdGVib29rMi5naWYpCgoKLS0tCgoKIyMgUk5vdGVib29rIHZzIFJNYXJrZG93biAgCgoKPGlmcmFtZSB3aWR0aD0iNTYwIiBoZWlnaHQ9IjMxNSIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC96TnpaMVBmVUROayIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPiAgCgoKaHR0cHM6Ly95b3V0dS5iZS96TnpaMVBmVUROawoKCgoKLS0tCgojIFIgTWFya2Rvd24KCiMjIEhlbSBrZW5kaSBrb2RsYXLEsSBoZW0gZGUgaHRtbCBrb2RsYXLEsSB5YXrEsWxhYmlsaXIKCmh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tCgo8aWZyYW1lIHNyYz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLzE3ODQ4NTQxNj9jb2xvcj00MjhiY2EmdGl0bGU9MCZieWxpbmU9MCZwb3J0cmFpdD0wIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQwMCIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhdXRvcGxheTsgZnVsbHNjcmVlbiIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPgo8cD48YSBocmVmPSJodHRwczovL3ZpbWVvLmNvbS8xNzg0ODU0MTYiPldoYXQgaXMgUiBNYXJrZG93bj88L2E+IGZyb20gPGEgaHJlZj0iaHR0cHM6Ly92aW1lby5jb20vcnN0dWRpb2luYyI+UlN0dWRpbywgSW5jLjwvYT4gb24gPGEgaHJlZj0iaHR0cHM6Ly92aW1lby5jb20iPlZpbWVvPC9hPi48L3A+CgotLS0KCiMjIFIgTWFya2Rvd246IFRoZSBEZWZpbml0aXZlIEd1aWRlCgpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vCgoKCgotLS0KCiMjIFIgTWFya2Rvd24gc3ludGF4CgpodHRwczovL2dpc3QuZ2l0aHViLmNvbS9NaW5oYXNLYW1hbC83ZmRlYmI3YzQyNGQyMzE0OTE0MAoKCjxzY3JpcHQgc3JjPSJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9NaW5oYXNLYW1hbC83ZmRlYmI3YzQyNGQyMzE0OTE0MC5qcyI+PC9zY3JpcHQ+CgoKCi0tLQoKIyMgUmVtZWR5IFBhY2thZ2UgIAoKWzxpbWcgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVGhpbmtSLW9wZW4vcmVtZWR5L21hc3Rlci9yZWZlcmVuY2UvZmlndXJlcy90aGlua3ItaGV4LXJlbWVkeS5wbmciIHdpZHRoPTI1MHB4Pl0oaHR0cHM6Ly9naXRodWIuY29tL1RoaW5rUi1vcGVuL3JlbWVkeSkKCgotLS0KCiMjIyBSZW1lZHkgIAoKWzxpbWcgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVGhpbmtSLW9wZW4vcmVtZWR5L21hc3Rlci9yZWZlcmVuY2UvZmlndXJlcy9yZW1lZHlfZXhhbXBsZS5naWYiIHdpZHRoPTUwMHB4Pl0oaHR0cHM6Ly9naXRodWIuY29tL1RoaW5rUi1vcGVuL3JlbWVkeSkKCgotLS0KCiMjIFIgTWFya2Rvd24gcGFrZXQgdmUgxZ9hYmxvbmxhcsSxICAKCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9kb2N1bWVudC10ZW1wbGF0ZXMuaHRtbAoKCiFbXShpbWFnZXMvUk1hcmtkb3duVGVtcGxhdGVzLmdpZikKCgotLS0KCiMjIFJlbmRlciBNYXJrZG93biB2aWEgY29kZQoKKmluc2lkZSBSKgoKYGBgCm1hcmtkb3duOjptYXJrZG93blRvSFRNTCgnbWFya2Rvd25fZXhhbXBsZS5tZCcsIAonbWFya2Rvd25fZXhhbXBsZS5odG1sJykKYGBgCgoqY29tbWFuZCBsaW5lKgoKYGBgClIgLWUgIm1hcmtkb3duOjptYXJrZG93blRvSFRNTCgnbWFya2Rvd25fZXhhbXBsZS5tZCcsCidtYXJrZG93bl9leGFtcGxlLmh0bWwnKSIKYGBgCgotLS0KCgojIyBwYW5kb2MgUnN0dWRpbyBpbnRlZ3JhdGlvbgoKKmNvbW1hbmQgbGluZSoKCmBgYApleHBvcnQgUEFUSD0kUEFUSDovQXBwbGljYXRpb25zL1JTdHVkaW8uYXBwL0NvbnRlbnRzL01hY09TL3BhbmRvYwpgYGAKCgpgYGAKUiAtZSAicm1hcmtkb3duOjpyZW5kZXIoJ21hcmtkb3duX2V4YW1wbGUubWQnKSIKYGBgCgoKLS0tCgojIFJNYXJrZG93biBgY2h1bmtgIGnDp2luZGUgYFJgIGtvZGxhcsSxbsSxIMOnYWzEscWfdMSxcm1hCgoKYGBgCntyLCByZXN1bHRzPSdhc2lzJ30KIGlyaXMgJT4lCiAgdGliYmxlOjphc190aWJibGUoKSAlPiUKICBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAndGliYmxlJykKYGBgCgotLS0KCiMgTWV0aW4gYXJhc8SxbmRhIGBSYCBrb2RsYXLEsW7EsSDDp2FsxLHFn3TEsXJtYQoKCiFbXShpbWFnZXMvaW5saW5lUkNvZGUucG5nKQoKCgotLS0KCiMgQ2h1bmsgT3B0aW9ucwoKIyMgR2xvYmFsIE9wdGlvbnMKCmBgYAp7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnBhdGggPSAnRmlncy8nLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBlcnJvciA9IEZBTFNFLCBldmFsID0gVFJVRSwgdGlkeSA9IFRSVUUsIGNvbW1lbnQgPSBOQSkKYGBgCgotLS0KCiMjIE90aGVyIENvZGUgTGFuZ3VhZ2VzCgoKWyFbXShodHRwczovL2QzM3d1YnJma2kwbDY4LmNsb3VkZnJvbnQubmV0LzE2MjM0N2VmNWFmZTIxOWRhMjJmYjdkN2Q5YTU5ODlmMmMzZTVhODUvNTkzMTYvbGVzc29uLWltYWdlcy9sYW5ndWFnZXMtMS1kZW1vcy5wbmcpXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9sZXNzb24tNS5odG1sKQoKCi0tLQoKCiMgUiBNYXJrZG93biBrb2Qgw7ZybmXEn2kgIAoKCmBgYAp7cn0KZGF0YSgiY2FuY2VyIikKY2FuY2VyCmZvcmVpZ246OndyaXRlLmZvcmVpZ24oZGYgPSBjYW5jZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFmaWxlID0gImRhdGEvY2FuY2VyLnNhdiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVmaWxlID0gImRhdGEvY2FuY2VyLnNwbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgPSAiU1BTUyIKICAgICAgICAgICAgICAgICAgICAgICAgKQpgYGAKCgoKCgotLS0KCiMgUiBNYXJrZG93biBQYWtldCDDh2HEn8Sxcm1hICAKCgpgYGAKe3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KCJ0aWR5dmVyc2UiKSkKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoInN1cnZpdmFsIikpCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KCJmaW5hbGZpdCIpKQpgYGAKCgotLS0KCiMgUiBNYXJrZG93biBWZXJpIFnDvGtsZW1lIFNQU1MgIAoKCgohW10oaW1hZ2VzL2ltcG9ydFNQU1MuZ2lmKQoKCi0tLQoKIyBSIE1hcmtkb3duIFZlcmkgWcO8a2xlbWUgRXhjZWwgIAoKCgohW10oaW1hZ2VzL2ltcG9ydEV4Y2VsLmdpZikKCgotLS0KCiMgUiBNYXJrZG93biBUYW7EsW1sYXnEsWPEsSDEsHN0YXRpc3Rpa2xlciAgCgoKYGBgCntyfQpsaWJyYXJ5KHN1bW1hcnl0b29scykKdmlldyhkZlN1bW1hcnkoY29sb25fcykpCmBgYAoKCgoKc3VtbWFyeXRvb2xzCmRlc2NyaXB0aXZlcwoKCi0tLQoKIyBSIE1hcmtkb3duIFJlY29kZSAgCgpyZWNvZGUKCgoKLS0tCgojIFIgTWFya2Rvd24gw7ZybmXEn2kgw4dhcHJheiBUYWJsb2xhciAgCgpjcm9zc3RhYmxlcwoKLS0tCgojIFIgTWFya2Rvd24gw7ZybmXEn2kgU2HEn2thbMSxbSAgCgoKc3Vydml2YWwKCgotLS0KCiMgR8O8bmNlbGxlbWVsZXIgb2x1bmNhIGtvZGxhciDDp2FsxLHFn2FjYWsgbcSxPwoKCi0tLQoKCiMjIFBha2V0IEvDvHTDvHBoYW5lbGVyaQoKLSBwYWNrcmF0IC8gcmVudgoKaHR0cHM6Ly9lbnZpcm9ubWVudHMucnN0dWRpby5jb20KCgotLS0KCgojIyBEb2NrZXIKCgotIGRvY2tlcgoKLS0tCgojIyBZZW5pIFIgc8O8csO8bWxlcmkgCgotIFJTd2l0Y2gKCmh0dHBzOi8vcnVkLmlzL3Jzd2l0Y2gvCgotIFVzaW5nIFJTd2l0Y2gKCmh0dHBzOi8vcnVkLmlzL3Jzd2l0Y2gvZ3VpZGUvCgoKIVs6IHNjYWxlIDMwJV0oaHR0cHM6Ly9ydWQuaXMvcnN3aXRjaC9ndWlkZS9tZW51LWluZm8ucG5nKQoKCgotLS0KCiMgWWVkZWtsZW1leWkgbmFzxLFsIHlhcGFjYcSfxLF6CgoKIyMgU2F2ZSBGaW5hbCBEYXRhCgoKYGBgCntyfQpzYXZlZCBkYXRhIGFmdGVyIGFuYWx5c2lzIHRvIGBteWRhdGEueGxzeGAuCgpzYXZlLmltYWdlKGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YV93b3JrX3NwYWNlLlJEYXRhIikpCgpyZWFkcjo6d3JpdGVfcmRzKHggPSBteWRhdGEsIHBhdGggPSBoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YV9hZnRlcmFuYWx5c2lzLnJkcyIpKQoKc2F2ZVJEUyhvYmplY3QgPSBteWRhdGEsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YS5yZHMiKSkKCndyaXRleGw6OndyaXRlX3hsc3gobXlkYXRhLCBoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YS54bHN4IikpCgpwYXN0ZTAocm93bmFtZXMoZmlsZS5pbmZvKGhlcmU6OmhlcmUoImRhdGEiLCAibXlkYXRhLnhsc3giKSkpLCAiIDogIiwgZmlsZS5pbmZvKGhlcmU6OmhlcmUoImRhdGEiLCAibXlkYXRhLnhsc3giKSkkY3RpbWUpCgpgYGAKCgoKCiMjIEdpdEh1YiAgCgpgYGAKe3IgZ2l0aHViIHB1c2h9CkNvbW1pdE1lc3NhZ2UgPC0gcGFzdGUoInVwZGF0ZWQgb24gIiwgU3lzLnRpbWUoKSwgc2VwID0gIiIpCndkIDwtIGdldHdkKCkKZ2l0Q29tbWFuZCA8LSBwYXN0ZSgiY2QgIiwgCiAgICAgICAgICAgICAgICAgICAgd2QsCiAgICAgICAgICAgICAgICAgICAgIiBcbiBnaXQgYWRkIC4gXG4gZ2l0IGNvbW1pdCAtLW1lc3NhZ2UgJyIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWl0TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAiJyBcbiBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyIFxuIiwKICAgICAgICAgICAgICAgICAgICBzZXAgPSAiIgogICAgICAgICAgICAgICAgICAgICkKc3lzdGVtKGNvbW1hbmQgPSBnaXRDb21tYW5kLAogICAgICAgaW50ZXJuID0gVFJVRQopCmBgYAoKLS0tCgojIyBHaXRIdWIgWWVkZWtsZW1lCgpgYGB7ciBnaXRodWIgcHVzaCwgZWNobz1UUlVFfQpDb21taXRNZXNzYWdlIDwtIHBhc3RlKCJ1cGRhdGVkIG9uICIsIFN5cy50aW1lKCksIHNlcCA9ICIiKQp3ZCA8LSBnZXR3ZCgpCmdpdENvbW1hbmQgPC0gcGFzdGUoImNkICIsIAogICAgICAgICAgICAgICAgICAgIHdkLAogICAgICAgICAgICAgICAgICAgICIgXG4gZ2l0IGFkZCAuIFxuIGdpdCBjb21taXQgLS1tZXNzYWdlICciLAogICAgICAgICAgICAgICAgICAgIENvbW1pdE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgIicgXG4gZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBcbiIsCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIiIKICAgICAgICAgICAgICAgICAgICApCgpzeXN0ZW0oY29tbWFuZCA9IGdpdENvbW1hbmQsCiAgICAgICBpbnRlcm4gPSBUUlVFCikKYGBgCgoKCgotLS0KCgojIEhlciBkw7Zrw7xtYW7EsW4gc29udW5hIGt1bGxhbmTEscSfxLFuxLF6IGvDvHTDvHBoYW5lbGVyIGnDp2luIGF0xLFmIHlhemTEsXJhYmlsaXJzaW5pegoKCmBgYAp7ciBsaWJyYXJ5IGNpdGF0aW9uLCBlY2hvPVRSVUV9CmNpdGF0aW9uKCkKCmBgYAoKCgoKLS0tCgoKIyMgTGlicmFyaWVzIFVzZWQgIAoKYGBge3IgbGlicmFyeSBjaXRhdGlvbiwgZWNobz1UUlVFfQpjaXRhdGlvbigpCmBgYAoKCgotLS0KCgojIyBCdSBvdHVydW1hIHNwZXNpZmlrIGt1bGxhbsSxbGFuIHBha2V0bGVyICAKCgoKYGBge3IgbGlicmFyeSBjaXRhdGlvbiBhcyByZXBvcnQsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnJlcG9ydDo6Y2l0ZV9wYWNrYWdlcyhzZXNzaW9uID0gc2Vzc2lvbkluZm8oKSkKYGBgCgoKLS0tCgojIyBUZWsgdGVrIHBha2V0IGF0xLFmbGFyxLEKCgpgYGAKe3IgbGlicmFyeSBjaXRhdGlvbnN9CmNpdGF0aW9uKCJ0aWR5dmVyc2UiKQoKYGBgCgoKYGBgCntyfQpjaXRhdGlvbigicmVhZHhsIikKY2l0YXRpb24oImphbml0b3IiKQpjaXRhdGlvbigicmVwb3J0IikKY2l0YXRpb24oImZpbmFsZml0IikKY2l0YXRpb24oImdnc3RhdHBsb3QiKQpgYGAKCgotLS0KCiMjIEphbW92aSB2ZSBSIGnDp2luIGF0xLFmIMO2cm5lxJ9pCgpUaGUgamFtb3ZpIHByb2plY3QgKDIwMTkpLiBqYW1vdmkuIChWZXJzaW9uIDAuOSkgW0NvbXB1dGVyIFNvZnR3YXJlXS4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy4KUiBDb3JlIFRlYW0gKDIwMTgpLiBSOiBBIExhbmd1YWdlIGFuZCBlbnZpb25tZW50IGZvciBzdGF0aXN0aWNhbCBjb21wdXRpbmcuIFtDb21wdXRlciBzb2Z0d2FyZV0uIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnLy4KRm94LCBKLiwgJiBXZWlzYmVyZywgUy4gKDIwMTgpLiBjYXI6IENvbXBhbmlvbiB0byBBcHBsaWVkIFJlZ3Jlc3Npb24uIFtSIHBhY2thZ2VdLiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9wYWNrYWdlPWNhci4KCgoKLS0tCgoKCiMgSGVyIGTDtmvDvG1hbsSxbiBzb251bmEgb3R1cnVtIGRldGF5bGFyxLFuxLF6xLEgeWF6ZMSxcmFiaWxpcnNpbml6ICAKCgpgYGAKe3Igc2Vzc2lvbiBpbmZvLCBlY2hvPVRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgoKCgotLS0KCgoKIyMgU2Vzc2lvbiBJbmZvCgoKYGBge3Igc2Vzc2lvbiBpbmZvLCBlY2hvPVRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgoKLS0tCgojIFNvbnJha2kgS29udWxhcgoKLSBSU3R1ZGlvIGlsZSBHaXRIdWIga3VsbGFuxLFtxLEKLSAuLi4KCgotLS0KCiMgU3VudW0gTGlua2xlcmkKCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9NeVJDb2Rlc0ZvckRhdGFBbmFseXNpcy9SLU1hcmtkb3duLm5iLmh0bWwKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvL015UkNvZGVzRm9yRGF0YUFuYWx5c2lzL1ItTWFya2Rvd24uaHRtbAoKaHR0cHM6Ly9mb3Jtcy5nbGUvVXFHSkJpQWpCOHVMUFJvbjgKCi0tLQoKCiMgR2VyaSBCaWxkaXJpbQoKLSBHZXJpIGJpbGRpcmltIGnDp2luIHTEsWtsYXnEsW7EsXo6IF9bR2VyaSBiaWxkaXJpbSBmb3JtdV0oaHR0cHM6Ly9nb28uZ2wvZm9ybXMvWWpHWjVESGd0UGxSMVJuQjMpXwoKCi0tLQoKCjxzY3JpcHQgaWQ9ImRzcS1jb3VudC1zY3IiIHNyYz0iLy9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vY291bnQuanMiIGFzeW5jPjwvc2NyaXB0PgoKPGRpdiBpZD0iZGlzcXVzX3RocmVhZCI+PC9kaXY+CjxzY3JpcHQ+CgovKioKKiAgUkVDT01NRU5ERUQgQ09ORklHVVJBVElPTiBWQVJJQUJMRVM6IEVESVQgQU5EIFVOQ09NTUVOVCBUSEUgU0VDVElPTiBCRUxPVyBUTyBJTlNFUlQgRFlOQU1JQyBWQUxVRVMgRlJPTSBZT1VSIFBMQVRGT1JNIE9SIENNUy4KKiAgTEVBUk4gV0hZIERFRklOSU5HIFRIRVNFIFZBUklBQkxFUyBJUyBJTVBPUlRBTlQ6IGh0dHBzOi8vZGlzcXVzLmNvbS9hZG1pbi91bml2ZXJzYWxjb2RlLyNjb25maWd1cmF0aW9uLXZhcmlhYmxlcyovCi8qCnZhciBkaXNxdXNfY29uZmlnID0gZnVuY3Rpb24gKCkgewp0aGlzLnBhZ2UudXJsID0gUEFHRV9VUkw7ICAvLyBSZXBsYWNlIFBBR0VfVVJMIHdpdGggeW91ciBwYWdlJ3MgY2Fub25pY2FsIFVSTCB2YXJpYWJsZQp0aGlzLnBhZ2UuaWRlbnRpZmllciA9IFBBR0VfSURFTlRJRklFUjsgLy8gUmVwbGFjZSBQQUdFX0lERU5USUZJRVIgd2l0aCB5b3VyIHBhZ2UncyB1bmlxdWUgaWRlbnRpZmllciB2YXJpYWJsZQp9OwoqLwooZnVuY3Rpb24oKSB7IC8vIERPTidUIEVESVQgQkVMT1cgVEhJUyBMSU5FCnZhciBkID0gZG9jdW1lbnQsIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwpzLnNyYyA9ICdodHRwczovL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9lbWJlZC5qcyc7CnMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKKGQuaGVhZCB8fCBkLmJvZHkpLmFwcGVuZENoaWxkKHMpOwp9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+CgoKLS0tCgojIMSwbGV0acWfaW0gIAoKQ29tcGxldGVkIG9uIGByIFN5cy5EYXRlKClgLiAgCgpTZXJkYXIgQmFsY2ksIE1ELCBQYXRob2xvZ2lzdCAgCmRyc2VyZGFyYmFsY2lAZ21haWwuY29tICAKCmh0dHBzOi8vcnB1YnMuY29tL3NiYWxjaS9DViAgIApodHRwczovL3NiYWxjaS5naXRodWIuaW8vICAKaHR0cHM6Ly9naXRodWIuY29tL3NiYWxjaSAgCmh0dHBzOi8vdHdpdHRlci5jb20vc2VyZGFyYmFsY2kKCgotLS0KCgojIE90aGVyIExpbmtzCgoKaHR0cHM6Ly9hbmRyZXdidHJhbi5naXRodWIuaW8vTklDQVIvMjAxOC93b3JrZmxvdy9kb2NzLzAyLXJtYXJrZG93bi5odG1sCgotIFRyb3VibGVzaG9vdGluZyBpbiBSIE1hcmtkb3duCgpodHRwczovL3NtaXRoY29sbGVnZS1zZHMuZ2l0aHViLmlvL3Nkcy1wdWJsaWMvcm1hcmtkb3duX3Byb2JsZW1zLmh0bWwKCgpodHRwOi8va2Jyb21hbi5vcmcva25pdHJfa251dHNoZWxsL3BhZ2VzL1JtYXJrZG93bi5odG1sCgpodHRwczovL2ticm9tYW4ub3JnL2tuaXRyX2tudXRzaGVsbC9wYWdlcy9vdmVydmlldy5odG1sCgpodHRwczovL2ticm9tYW4ub3JnL2tuaXRyX2tudXRzaGVsbC9wYWdlcy9SbWFya2Rvd24uaHRtbAoKaHR0cHM6Ly9rYnJvbWFuLm9yZy9rbml0cl9rbnV0c2hlbGwvcGFnZXMvbWFya2Rvd24uaHRtbAoKCmh0dHBzOi8vb25wNC5jb20vCgoKCmBgYApjc3Yge2hlYWRlcnM6IHRydWUsIHRpdGxlOiAiKipEcmF3aW5nIFRhYmxlcyBJbiBNYXJrZG93bioqIn0KTmFtZSwgU3VybmFtZSwgS25vd24gQXMsIEFnZQpNYXJjZWxvLCBEYXZpZCwgY29sZHplcmEsIDIyCk9sZWtzYW5kciwgS29zdHlsaWV2LCBzMW1wbGUsIDE5Ck5pa29sYSwgS292YcSNLCBOaUtvLCAyMApSaWNoYXJkLCBQYXBpbGxvbiwgc2hveCwgMjUKTmljb2xhaSwgUmVlZHR6LCBkZXYxY2UsIDIxCmBgYAoKYGBgCntwZ259CltFdmVudCAiQmxlZC1aYWdyZWItQmVsZ3JhZGUgQ2FuZGlkYXRlcyJdCltTaXRlICJCbGVkLCBaYWdyZWIgJiBCZWxncmFkZSBZVUciXQpbRGF0ZSAiMTk1OS4xMC4xMSJdCltSb3VuZCAiMjAiXQpbUmVzdWx0ICIxLTAiXQpbV2hpdGUgIk1pa2hhaWwgVGFsIl0KW0JsYWNrICJSb2JlcnQgSmFtZXMgRmlzY2hlciJdCgoxLiBkNCBOZjYgMi4gYzQgZzYgMy4gTmMzIEJnNyA0LiBlNCBkNiA1LgpCZTIgTy1PIDYuIE5mMyBlNSA3LiBkNSBOYmQ3IDguIEJnNSBoNiA5LgpCaDQgYTYgMTAuIE8tTyBRZTggMTEuIE5kMiBOaDcgMTIuIGI0IEJmNgoxMy4gQnhmNiBOaHhmNiAxNC4gTmIzIFFlNyAxNS4gUWQyIEtoNyAxNi4KUWUzIE5nOCAxNy4gYzUgZjUgMTguIGV4ZjUgZ3hmNSAxOS4gZjQgZXhmNAoyMC4gUXhmNCBkeGM1IDIxLiBCZDMgY3hiNCAyMi4gUmFlMSBRZjYgMjMuClJlNiBReGMzIDI0LiBCeGY1KyBSeGY1IDI1LiBReGY1KyBLaDggMjYuClJmMyBRYjIgMjcuIFJlOCBOZjYgMjguIFF4ZjYrIFF4ZjYgMjkuIFJ4ZjYKS2c3IDMwLiBSZmY4IE5lNyAzMS4gTmE1IGg1IDMyLiBoNCBSYjggMzMuCk5jNCBiNSAzNC4gTmU1IDEtMApgYGAKCgotIEtlZXBpbmcgQ3JlZGVudGlhbHMgU2VjcmV0IHdpdGggS2V5cmluZ3MgaW4gUgoKaHR0cHM6Ly9yYXM0NC5naXRodWIuaW8vYmxvZy8yMDE5LzAxLzE5L2tlZXBpbmctY3JlZGVudGlhbHMtc2VjcmV0LXdpdGgta2V5cmluZ3MtaW4tci5odG1sCgotIEhvdyB0byBidWlsZCBhIHdlYnNpdGUgd2l0aCBCbG9nZG93biBpbiBSCgpodHRwOi8vd3d3LnN0b3J5YmVuY2gub3JnL2hvdy10by1idWlsZC1hLXdlYnNpdGUtd2l0aC1ibG9nZG93bi1pbi1yLwo=